iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
自我挑戰組

ABAP 基礎30天學習筆記系列 第 19

Day19_structure賦值

  • 分享至 

  • xImage
  •  

原文連結:Working with Structured Data Objects

Structure 物件

選取structure下的欄位

要選取structure底下的欄位元件,以左右不帶空格的-來指定元件,語法上為<structure名稱>-<欄位名稱>
這種寫法可以讓structure底下的欄位像普通變數般被賦值或呼叫,或在SQL SELECT的INTO及WHERE中使用。

*建立structure型別
TYPES: BEGIN OF st_connection_nested,
            airport_from_id TYPE /dmo/airport_from_id,
            airport_to_id   TYPE /dmo/airport_to_id,
            message         TYPE symsg,
            carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection_nested.
       
*建立structure
    DATA connection TYPE st_connection.

*為structure的特定欄位賦值
    connection-airport_from_id = 'ABC'.
    connection-airport_to_id   = 'XYZ'.
    connection-carrier_name    = 'My Airline'.

如果該structure是個巢狀structure,一樣使用不帶空格的-來指定下層元件,如CONNECTION_NESTED-message-msgty

*建立巢狀structure型別
*子structure 參照 symsg
TYPES: BEGIN OF st_connection_nested,
            airport_from_id TYPE /dmo/airport_from_id,
            airport_to_id   TYPE /dmo/airport_to_id,
            message         TYPE symsg,
            carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection_nested.

*建立巢狀structure
DATA connection_nested TYPE st_Connection_nested.


*為巢狀structure的欄位賦值
    connection_nested-message-msgty = 'E'.
    connection_nested-message-msgid = 'ABC'.
    connection_nested-message-msgno = '123'.

VALUE 運算子

除了用前述範例賦值,也可以使用VALUE #( )表達式為structure賦值。井字號#於ABAP執行時可以建構一個和賦值目標型別相同的structure,並在括號內為欄位賦值,在這裡不一定要一口氣為所有structure下的欄位賦值。

*使用前一個例子裡的巢狀structure
connection_nested = VALUE #( airport_from_id = 'ABC'
                             airport_to_id   = 'XYZ'
                             message         = VALUE #( msgty = 'E'
                                                        msgid = 'ABC'
                                                        msgno = '123' )
                             carrier_name    = 'My Airline'
                    ).

注意,使用這種方式賦值將會刪去該structure原本的現有值,再以表達式中的值重新填入。

直接複製structure的值

當兩個structure的型別結構相容,可以直接把structureA賦值給structureB,但如果型別不同,將可能導致兩種結果:

  • 當structureA有非文字型別(non-char like)欄位元件,且對應到structureB卻是文字型別(char-like)的欄位時,將產生語法錯誤。
  • 如果兩者都是文字型別(char-like)欄位,在技術上可以直接賦值,但通常結果會是錯誤的。
DATA connection TYPE st_connection.
DATA connection_nested TYPE st_Connection_nested.
    
connection_nested =  connection."!!可能產生error!!"

https://ithelp.ithome.com.tw/upload/images/20240915/20113802NjiFRq9nUn.png

在上圖範例中,兩個structure雖然都有carrier_name這欄,但carrier_name的內容被錯誤的劃分進了message欄位中。且這類錯誤不會有error log,所以要特別小心。

為了應付上面欄位沒有對應好的狀況,可以用表達式CORRESPONDING依照同名欄位自動對應賦值,有以下幾個要點:

  • 欄位需要有相同名稱。
  • 欄位在兩個structure中不須位於相同的順序。
  • 如果欄位具有不同資料型別,ABAP將會試圖用前幾章的規則自動轉換。

寫法如下:

DATA connection TYPE st_connection.
DATA connection_nested TYPE st_Connection_nested.
    
connection_nested = CORRESPONDING #(  connection )."同名欄位自動對應賦值"

了解如何為structure賦值後,明天接著介紹structure如何與SQL一起使用~


上一篇
Day18_structure物件介紹與建立
下一篇
Day20_用ABAP SQL存資料進structure & JOIN使用
系列文
ABAP 基礎30天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言